package com.limi.java8.lambda.practice;

import org.junit.Test;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author Limi Pan
 * @create 2018-09-16 22:04
 */
public class LambdaPractice {

    List<Employee> emps = Arrays.asList(
            new Employee(101, "张三", 18, 9957.36),
            new Employee(102, "李四", 22, 12238.86),
            new Employee(103, "王五", 28, 51235.87),
            new Employee(104, "赵六", 43, 3458.65),
            new Employee(105, "老七", 28, 5675.99)
    );

    /*
     * 调用Collections.sort()方法，通过定制排序比较两个Employee(先按年龄比，年龄相同按姓名比)，
     * 使用Lambda参数传递。
     */
    @Test
    public void test1(){
        Collections.sort(emps, (e1, e2) -> {
            if (e1.getAge() == e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else {
                return Integer.compare(e1.getAge(), e2.getAge());
            }
        });

        emps.forEach(e -> System.out.println(e));
    }

    /*
     * 1.声明函数式接口，接口中声明抽象方法，public String getValue(String str)
     * 2.声明类TestLambda,类中编写方法使用接口作为参数，将一个字符创转换成大写，并作为方法的返回值
     * 3.再声明一个字符串的第2个和第6个索引位置进行截取子串
     */
    @Test
    public void test2(){
        String upper = strHandler("abcdefg", str -> str.toUpperCase());
        System.out.println(upper);

        String newStr = strHandler("I love java8", str -> str.substring(2, 6));
        System.out.println(newStr);

    }

    // 用于对字符串的处理
    public String strHandler(String str, MyFunction myFun2){
        return myFun2.getValue(str);
    }


    /*
     * 1.声明一个带两个泛型的函数式接口，泛型类型为<T, R> T为参数，R为返回值
     * 2.接口中声明对相应抽象方法
     * 3.在TestLambda类中声明方法，使用接口作为参数，计算两个long型参数的和
     * 4.再计算两个long型参数的乘积。
     */
    @Test
    public void test3(){
        op(100L, 200L, (X, y) -> X + y );

        op(100L, 200L, (X, y) -> X * y );
    }

    public void op(Long l1, Long l2, MyFunction2<Long, Long> my){
        System.out.println(my.getValue(l1, l2));
    }

}
